import { reqCategoryList1, reqCategoryList2, reqCategoryList3 } from "@/api";
import Vue from "vue";
const state = {
  Category1List: []
};
const mutations = {
  setCategory1List(state, payload) {
    state.Category1List = payload.Category1List;
    // 顺便给Category1List数组中每一个对象都添加一个children属性
    state.Category1List.forEach(item => {
      Vue.set(item, "children", []);
    });
  },
  setCategory2List(state, payload) {
    state.Category1List[payload.nowCategoryIndex].children = payload.result;
  }
};
const actions = {
  // 获取一级分类的列表
  async getCategory1List({ commit }) {
    const sults = await reqCategoryList1();
    // console.log(sults);
    commit("setCategory1List", { Category1List: sults });
  },
  // 获取二级分类的列表
  async getCategory2List(store, Category1Id) {

    // 如果想要子啊action函数中拿到当前的模块的state数据有两种方式 1.this：指的是完成的store 2.参数store：指的是当前的store
    // 先判断当前Category1Id对应的一级分类属性上有没有children属性，如果有说明已经获取过了 则不在发送请求 如果没有则发送请求
    const nowCategory = store.state.Category1List.find(
      item => item.id === Category1Id
    );

    const nowCategoryIndex = store.state.Category1List.findIndex(
      item => item.id === Category1Id
    );

    if (nowCategory.children.length !== 0) return;

    // console.log(nowCategory);
    // 如果当前一级分类没有children属性，则说明没有发过当前id的二级分类请求，则需要重新发送请求
    const result = await reqCategoryList2(Category1Id);

    // 声明一个数组，专门保存所有三级请求的promise 方便以后使用
    const reqArr = [];

    // 遍历所有的二级分类列表，根据id发送三级列表请求，把发送的得到的promise使用数组收集起来
    result.forEach(item => {
      const category3Promise = reqCategoryList3(item.id);
      reqArr.push(category3Promise);
    });

    // 把收集所有当前二级中的三级列表请求所在的数组 使用Promise.all 进行并发处理
    // Promise.all返回promise实例，如果接收的参数中所有的promise都成功，则all方法返回的promise就成功
    const category3Result = await Promise.all(reqArr);

    // 遍历请求的结果，把每一个值插入到对应的二级列表中
    category3Result.forEach((item, index) => {
      result[index].children = item;
    });


    store.commit("setCategory2List", { nowCategoryIndex, result });
  }
};
const getters = {};

export default {
  namespaced: true,
  state,
  mutations,
  actions,
  getters
};